package org.liyufeng.project.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.liyufeng.project.message.resp.Article;
import org.liyufeng.project.message.resp.NewsMessage;
import org.liyufeng.project.message.resp.TextMessage;
import org.liyufeng.project.servlet.CoreServlet;
import org.liyufeng.project.util.MessageUtil;
import org.liyufeng.project.pojo.BaiduPlace;
import org.liyufeng.project.pojo.UserLocation;
import org.liyufeng.project.util.BaiduMapUtil;
import org.liyufeng.project.util.MessageUtil;
import org.liyufeng.project.util.MySQLUtil;
import org.liyufeng.project.util.OAuth2Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 核心服务类
 * 
 * @author liyufeng
 * @date   20141024
 */
public class CoreService {
	/**
	 * 处理微信发来的请求
	 * 
	 * @param request
	 * @return xml
	 */
	private static Logger log = LoggerFactory.getLogger(CoreService.class);
	
	public static String processRequest(String request) {
		// xml格式的消息数据
		String respXml = null;
		// 默认返回的文本消息内容
		String respContent = null;
		
		try {
			// 调用parseXml方法解析请求消息
			Map<String, String> requestMap = MessageUtil.parseXml(request);
			// 发送方帐号
			String fromUserName = requestMap.get("FromUserName");
			// 开发者微信号
			String toUserName = requestMap.get("ToUserName");
			// 消息类型
			String msgType = requestMap.get("MsgType");
			//消息创建时间
			String createTime=requestMap.get("CreateTime");
			//应用代理ID
			String agentId=requestMap.get("AgentID");
			//回复文本消息
			String eventType = requestMap.get("Event");
			
			TextMessage textMessage = new TextMessage();
			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
			// 事件推送
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
				// 事件类型
				 System.out.println(requestMap.get("Event"));
				// 订阅关注
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					textMessage.setContent("亲，想你了  /微笑  怎么现在才来呢？\n\n欢迎关注成都触及科技有限公司公众号<a href=\"http://www.appshowings.com\">触及科技</a>");
					// 将消息对象转换成xml
					respXml = MessageUtil.messageToXml(textMessage);
				}
				else if (eventType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
					// 用户发送的经纬度
					String lng = requestMap.get("Location_Y");
					String lat = requestMap.get("Location_X");
					// 坐标转换后的经纬度
					String bd09Lng = null;
					String bd09Lat = null;
					// 调用接口转换坐标
					UserLocation userLocation = BaiduMapUtil.convertCoord(lng, lat);
					if (null != userLocation) {
						bd09Lng = userLocation.getBd09Lng();
						bd09Lat = userLocation.getBd09Lat();
					}
					// 保存用户地理位置
					MySQLUtil.saveUserLocation(fromUserName, lng, lat, bd09Lng, bd09Lat);
				}
				// 取消订阅
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					// TODO 暂不做处理
				}
				// 自定义菜单点击事件
				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
					// 事件KEY值，与创建菜单时的key值对应
					String eventKey = requestMap.get("EventKey");
					// 根据key值判断用户点击的按钮
					if (eventKey.equals("gameapps")) {
						Article article = new Article();
						article.setTitle("游戏app");
						article.setDescription("成都触及科技有限公司游戏app\n\n专业开发手机APP,游戏APP等\n\n");
						article.setPicUrl("");
						article.setUrl("http://gordongao36.gotoip4.com/game-list.html");
						List<Article> articleList = new ArrayList<Article>();
						articleList.add(article);
						// 创建图文消息
						NewsMessage newsMessage = new NewsMessage();
						newsMessage.setToUserName(fromUserName);
						newsMessage.setFromUserName(toUserName);
						newsMessage.setCreateTime(new Date().getTime());
						newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
						newsMessage.setArticleCount(articleList.size());
						newsMessage.setArticles(articleList);
						respXml = MessageUtil.messageToXml(newsMessage);
					} else if (eventKey.equals("LBS")) {
						respContent = getUsage();
					} else if (eventKey.equals("chatRobot")) {
					    respContent = "发送任意文本，我们开始聊天吧";
				    } else if (eventKey.equals("PayrollPersonal")) {
					    //respContent = "发送任意文本，我们开始聊天吧";
				    	
				    } 
				}
			}
			
			// 当用户发文本消息时
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				String content = requestMap.get("Content").trim();
				if (content.equals("附近")) {
					//respContent = getUsage();
					respContent=OAuth2Util.GetCode();
				}
				// 周边搜索
				else if (content.startsWith("附近")) {
					String keyWord = content.replaceAll("附近", "").trim();
					// 获取用户最后一次发送的地理位置
					UserLocation location = MySQLUtil.getLastLocation( fromUserName);
					// 未获取到
					if (null == location) {
						respContent = getUsage();
					} else {
						// 根据转换后（纠偏）的坐标搜索周边POI
						List<BaiduPlace> placeList = BaiduMapUtil.searchPlace(keyWord, location.getBd09Lng(), location.getBd09Lat());
						// 未搜索到POI
						if (null == placeList || 0 == placeList.size()) {
							respContent = String.format("/难过，您发送的位置附近未搜索到“%s”信息！", keyWord);
						} else {
							List<Article> articleList = BaiduMapUtil.makeArticleList(placeList, location.getBd09Lng(), location.getBd09Lat());
							// 回复图文消息
							NewsMessage newsMessage = new NewsMessage();
							newsMessage.setToUserName(fromUserName);
							newsMessage.setFromUserName(toUserName);
							newsMessage.setCreateTime(new Date().getTime());
							newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
							newsMessage.setArticles(articleList);
							newsMessage.setArticleCount(articleList.size());
							respXml = MessageUtil.messageToXml(newsMessage);
						}
					}
				} else
					respContent=ChatService.chat(fromUserName, createTime, content);
			}
			// 用户发送地理位置消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				// 用户发送的经纬度
				String lng = requestMap.get("Location_Y");
				String lat = requestMap.get("Location_X");
				// 坐标转换后的经纬度
				String bd09Lng = null;
				String bd09Lat = null;
				// 调用接口转换坐标
				UserLocation userLocation = BaiduMapUtil.convertCoord(lng, lat);
				if (null != userLocation) {
					bd09Lng = userLocation.getBd09Lng();
					bd09Lat = userLocation.getBd09Lat();
				}
				// 保存用户地理位置
				MySQLUtil.saveUserLocation(fromUserName, lng, lat, bd09Lng, bd09Lat);

				StringBuffer buffer = new StringBuffer();
				buffer.append("[愉快]").append("成功接收您的位置！").append("\n\n");
				buffer.append("您可以输入搜索关键词获取周边信息了，例如：").append("\n");
				buffer.append("        附近ATM").append("\n");
				buffer.append("        附近KTV").append("\n");
				buffer.append("        附近厕所").append("\n");
				buffer.append("必须以“附近”两个字开头！");
				respContent = buffer.toString();
			} 
			if (null != respContent) {
				// 设置文本消息的内容
				textMessage.setContent(respContent);
				// 将文本消息对象转换成xml
				respXml = MessageUtil.messageToXml(textMessage);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return respXml;
	}
	
	/**
	 * 关注提示语
	 * 
	 * @return
	 */
	private static String getSubscribeMsg() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("您是否有过出门在外四处找ATM或厕所的经历？").append("\n\n");
		buffer.append("您是否有过出差在外搜寻美食或娱乐场所的经历？").append("\n\n");
		buffer.append("周边搜索为您的出行保驾护航，为您提供专业的周边生活指南，回复“附近”开始体验吧！");
		return buffer.toString();
	}

	/**
	 * 使用说明
	 * 
	 * @return
	 */
	private static String getUsage() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("周边搜索使用说明").append("\n\n");
		buffer.append("1）发送地理位置").append("\n");
		buffer.append("点击窗口底部的“+”按钮，选择“位置”，点“发送”").append("\n\n");
		buffer.append("2）指定关键词搜索").append("\n");
		buffer.append("格式：附近+关键词\n例如：附近ATM、附近KTV、附近厕所");
		return buffer.toString();
	}
}
